package com.kk.goGame.controller;

import com.qf.framwork.annotation.RequestParams;
import com.qf.framwork.base.BaseServlet;
import com.qf.framwork.uploader.MultipartFile;
import com.qf.framwork.utils.PropertiesUtils;
import org.apache.commons.io.IOUtils;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.UUID;

/**
 * 文件相关的servlet
 */
@WebServlet("/FileServlet")
public class FileServlet extends BaseServlet {

    /**
     * 图片上传的servlet
     * @return
     */
    public String uploaderImg(@RequestParams("file") MultipartFile file){
        if (file == null) return null;

        //上传的路径
        String uploadPath = PropertiesUtils.getProperties("uploadPath");
        File pathFile = new File(uploadPath);
        //判断路径是否存在
        if(!pathFile.exists()) {
            //创建路径
            pathFile.mkdirs();
        }

        //作业：截取原文件名称的后缀，拼接到现文件名上
        //上传的文件名
        String fileName = UUID.randomUUID().toString().replace("-","")+".jpg";


        try (
                //获得了上传文件的输入流
                InputStream in = file.getInputStream();
                //准备一个本地的输出流
                OutputStream out = new FileOutputStream(new File(pathFile, fileName));
        ) {

            //数据拷贝
            IOUtils.copy(in, out);

            //字节数组 - 勺子（内存空间）
//            byte[] bytes = new byte[1024 * 10];
//            while(true) {
//                //从输入流中读取数据到字节数组里
//                //in.read(bytes); - 从输入流中读取数据放到byte数组里，不一定放满; 返回值表示本地读取到字节数； 如果返回-1表示完全没有读到数据，简单来说就是读完了
//                int len = in.read(bytes);
//                if (len == -1) break;
//                //  out.write(bytes); - 从byte数组中，将数据写入到输出流
//                out.write(bytes, 0, len);
//            }

                //常规写法
//            int len = 0;
//            while((len = in.read(bytes)) != -1){
//                out.write(bytes, 0, len);
//            }

            //上传成功，返回文件名称
            return fileName;
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

    /**
     * 获取上传图片
     */
    public void getImg(@RequestParams("fileName") String fileName, HttpServletResponse response) throws ServletException {

        //获取上传的路径
        String uploaderPath = PropertiesUtils.getProperties("uploadPath");
        //配合上传的文件名
        File file = new File(uploaderPath, fileName);
        if (!file.exists()) {
            throw new ServletException(fileName + "文件不存在！");
        }


        try (
                //获取当前文件对应的输入流
                InputStream in = new FileInputStream(file);
                //输出流在哪里？
                OutputStream out = response.getOutputStream();
        ) {
            //文件拷贝
            IOUtils.copy(in, out);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }

    }
}
